﻿using System;
using System.Collections.Generic;
using System.Data.OleDb;
using System.Linq;
using System.Web;

namespace FlyingCircusWebIS.Models
{
    public class AeronaveDAO: IAeronaveDAO
    {
        IModeloAeronaveDAO modeloAeronaveDAO;

        public AeronaveDAO()
        {
            modeloAeronaveDAO = new ModeloAeronaveDAO();
        }

        public void Adicionar(Aeronave entidade)
        {
            string sqlAtualizar 
                = "insert into AERONAVE (IdAeronave, IdModeloAeronave, Descricao, FlagAtivo) values (seqAeronave.nextVal, ?, ?, ?)";

            // Configura o comando
            OleDbCommand comando = new OleDbCommand();
            comando.Connection = GerenciadorConexao.Conexao;
            comando.CommandText = sqlAtualizar;

            OleDbParameter pIdModeloAeronave = new OleDbParameter("IdModeloAeronave", OleDbType.Integer);
            pIdModeloAeronave.Value = entidade.IdModeloAeronave;
            comando.Parameters.Add(pIdModeloAeronave);

            OleDbParameter pDescricao = new OleDbParameter("Descricao", OleDbType.VarChar);
            pDescricao.Value = entidade.Descricao;
            comando.Parameters.Add(pDescricao);

            OleDbParameter pFlagAtivo = new OleDbParameter("pFlagAtivo", OleDbType.VarChar);
            pFlagAtivo.Value = entidade.FlagAtivo;
            comando.Parameters.Add(pFlagAtivo);

            // Insert
            comando.ExecuteNonQuery();
            comando.Dispose();
        }

        public void Atualizar(Aeronave entidade)
        {
            string sqlAtualizar = "update AERONAVE set Descricao = ?, IdModeloAeronave = ?, FlagAtivo = ? where IdAeronave = ?";

            // Configura o comando
            OleDbCommand comando = new OleDbCommand();
            comando.Connection = GerenciadorConexao.Conexao;
            comando.CommandText = sqlAtualizar;


            OleDbParameter pDescricao = new OleDbParameter("Descricao", OleDbType.VarChar);
            pDescricao.Value = entidade.Descricao;
            comando.Parameters.Add(pDescricao);

            OleDbParameter pIdModeloAeronave = new OleDbParameter("IdModeloAeronave", OleDbType.Integer);
            pIdModeloAeronave.Value = entidade.IdModeloAeronave;
            comando.Parameters.Add(pIdModeloAeronave);

            OleDbParameter pFlagAtivo = new OleDbParameter("FlagAtivo", OleDbType.VarChar);
            pFlagAtivo.Value = entidade.FlagAtivo;
            comando.Parameters.Add(pFlagAtivo);

            OleDbParameter IdAeronave = new OleDbParameter("IdAeronave", OleDbType.Integer);
            IdAeronave.Value = entidade.IdAeronave;
            comando.Parameters.Add(IdAeronave);

            // Update
            comando.ExecuteNonQuery();
            comando.Dispose();
        }

        public void RemoverPorId(int id)
        {
            string sqlDeletar = "delete AERONAVE where IdAeronave = ?";

            // Configura o comando
            OleDbCommand comando = new OleDbCommand();
            comando.Connection = GerenciadorConexao.Conexao;
            comando.CommandText = sqlDeletar;

            OleDbParameter pId = new OleDbParameter("IdAeronave", OleDbType.VarChar);
            pId.Value = id;
            comando.Parameters.Add(pId);

            // Delete
            comando.ExecuteNonQuery();
            comando.Dispose();
        }

        public Aeronave BuscarPorId(int id)
        {
            Aeronave registro = null;
            string sqlBuscar = "select * from AERONAVE where IdAeronave = ?";

            // Configura o comando
            OleDbCommand comando = new OleDbCommand();
            comando.Connection = GerenciadorConexao.Conexao;
            comando.CommandText = sqlBuscar;

            OleDbParameter pId = new OleDbParameter("IdAeronave", OleDbType.Integer);
            pId.Value = id;
            comando.Parameters.Add(pId);

            // Select
            OleDbDataReader dr = comando.ExecuteReader();
            if (dr.Read())
            {
                registro = ConverterDataReaderParaObj(dr);
            }
            dr.Close();
            comando.Dispose();

            if (registro != null)
                CarregarComposicao(registro);

            return registro;
        }

        private void CarregarComposicao(Aeronave registro)
        {
            int idModeloAeronave = registro.IdModeloAeronave;
            ModeloAeronave modeloAeronave = modeloAeronaveDAO.BuscarPorId(idModeloAeronave);
            registro.ModeloAeronave = modeloAeronave;
        }

        public List<Aeronave> Listar()
        {
            String sqlConsulta = "select * from AERONAVE";

            // Configura o comando
            OleDbCommand comando = new OleDbCommand();
            comando.Connection = GerenciadorConexao.Conexao;
            comando.CommandText = sqlConsulta;

            // Select
            OleDbDataReader dr = comando.ExecuteReader();

            List<Aeronave> registros = new List<Aeronave>();
            while (dr.Read())
            {
                Aeronave registro = ConverterDataReaderParaObj(dr);
                registros.Add(registro);
            }
            dr.Close();
            comando.Dispose();

            foreach (var registro in registros)
            {
                CarregarComposicao(registro);
            }

            return registros;
        }

        private Aeronave ConverterDataReaderParaObj(OleDbDataReader dr)
        {
            Aeronave registro = new Aeronave();
            registro.IdAeronave = Int32.Parse(dr["IdAeronave"].ToString());
            registro.IdModeloAeronave = Int32.Parse(dr["IdModeloAeronave"].ToString());
            registro.Descricao = dr["Descricao"].ToString();
            registro.FlagAtivo = dr["FlagAtivo"].ToString();

            return registro;
        }


        public void AtivarPorId(int id)
        {
            string sqlAtualizar = "update AERONAVE set flagAtivo = 'S' where IdAeronave = " + id;

            // Configura o comando
            OleDbCommand comando = new OleDbCommand();
            comando.Connection = GerenciadorConexao.Conexao;
            comando.CommandText = sqlAtualizar;

            // Update
            comando.ExecuteNonQuery();
            comando.Dispose();
        }

        public void DesativarPorId(int id)
        {
            string sqlAtualizar = "update AERONAVE set flagAtivo = 'N' where IdAeronave = " + id;

            // Configura o comando
            OleDbCommand comando = new OleDbCommand();
            comando.Connection = GerenciadorConexao.Conexao;
            comando.CommandText = sqlAtualizar;

            // Update
            comando.ExecuteNonQuery();
            comando.Dispose();
        }
    }
}